#include "impresor_de_resultados.h"

std::string ImpresorDeResultados::traducirNodoResultado (NodoResultado* nodo){

	switch (nodo->getDescriptor()){
	case PROMEDIO_MAYOR_A_CUATRO:
		if(nodo->getValorDescriptor()){
			return  "tienen promedio mayor a cuatro.";
		}
		return "tienen promedio menor o igual a cuatro.";

	case ES_HOMBRE:
		if(nodo->getValorDescriptor()){
			return "son hombres, ";
		}
		return "son mujeres, ";

	case MAYOR_DE_VEINTICUATRO:
		if(nodo->getValorDescriptor()){
			return "son mayores de veinticuatro años, ";
		}
		return "son menores de veinticinco años, ";

	case TRABAJA:
		if(nodo->getValorDescriptor()){
			return "trabajan, ";
		}
		return "no trabajan, ";

	case ESTUDIA_SEIS_HORAS_SEMANALES:
		if(nodo->getValorDescriptor()){
			return "estudian al menos seis horas semanales, ";
		}
		return "estudian menos de seis horas semanales, ";

	}

	return "";
}

void ImpresorDeResultados::imprimirPilaDeResultados(Pila<IteradorNodo>& laPila){


	if(laPila.tamanio() == 1){
		IteradorNodo iterador = laPila.pop();
		std::cout << "Todos los alumnos " << this->traducirNodoResultado(iterador.get()) << std::endl;
		laPila.push(iterador);
	}else{
		Pila<IteradorNodo> pilaAuxiliar;

		std::cout << "Los alumnos que ";

		while(laPila.estaVacia() == false){
			pilaAuxiliar.push(laPila.pop());
		}

		while(pilaAuxiliar.estaVacia() == false){
			IteradorNodo iterador = pilaAuxiliar.pop();
			std::cout << this->traducirNodoResultado(iterador.get());
			laPila.push(iterador);
		}

		std::cout << std::endl;
	}



}

void ImpresorDeResultados::imprimirResultado(Resultado elResultado) {

	Lista<NodoResultado*>* listaNodos = elResultado.getListaNodosResultado();

	if(listaNodos->estaVacia()) {
		return;
	}

	IteradorLista<NodoResultado*> iterador = listaNodos->iterador();

	Pila<IteradorNodo> unaPila;

	bool recorriendo_hacia_abajo = true;

	do{

		if(recorriendo_hacia_abajo == true){
			NodoResultado* unNodo = iterador.get();
			unaPila.push(iterador);
			if(unNodo->getListaHijos() != 0){
				iterador = unNodo->getListaHijos()->iterador();
			}else{
				//Estamos en un una hoja.
				this->imprimirPilaDeResultados(unaPila);
				unaPila.pop();
				recorriendo_hacia_abajo = false;
			}
		}else{
			iterador = unaPila.pop();
			if(iterador.tieneSiguiente()){
				iterador.siguiente();
				unaPila.push(iterador);
				recorriendo_hacia_abajo = true;
			}
		}

	}while(unaPila.estaVacia() == false);

}
